#include "server.h"

char* MkDir( char* DirName)   //创建文件夹
{
    int ret;
    ret = mkdir(DirName,0777);
    ERROR_CHECK(ret,-1,"mkdir");
    return "success";
}

//cd + 当前目录下文件名，无论正确与否，都会给出提示信息
char* CdDir(char* FileName){

    char buf[100] = {0}; // 用来接收filename
    strcpy(buf,FileName);

    struct stat statbuf;
    int ret = stat(buf, &statbuf); // 获取filename文件的状态

    if(-1 == ret){ // -1代表这个文件不存在，出错误了
        return "The file does not exist.\n";
    }else{ // ret = 0 
        switch(statbuf.st_mode & S_IFMT){
        case S_IFBLK:
        case S_IFCHR:
        case S_IFIFO:
        case S_IFLNK:
        case S_IFREG:
        case S_IFSOCK:return "The file is not a directory.\n"; // 当filename不是目录就返回一段提示文字
        case S_IFDIR:ret = chdir(buf); // 如果是目录文件就改变当前的工作目录
                     ERROR_CHECK(ret, -1, "chdir");
                     char* cwd = getcwd(NULL, 0);
                     return cwd; // 打印一下当前路径，给予提示信息
        }
    }
}

//ls + 空值 ，直接展示当前ls目录下所有文件名
//ls + 目录名 ，展示当前目录下 某目录文件下的所有文件名(暂时只能传目录名)
char* LsDir(char* FileName){

    char filename[1024] = {0};
    strcpy(filename, FileName); // 用来存储传来的文件名

    struct dirent* pdirent; // 目录的结构体

    char buf[4096] = {0}; // 用来保存文件夹下所有文件名，暂时用4096字节保存


    if(filename == NULL){ // client只传来ls，不加修饰符

        char* cwd = getcwd(NULL, 0); // 获取当前路径
        DIR* pdir = opendir(cwd); // 打开当前路径文件夹

        while((pdirent = readdir(pdir)) != NULL){ // 循环读取目录内容
            strcat(buf, pdirent->d_name); // 把每一个文件名都拼接起来
            strcat(buf, "  "); // 再拼接两个空格，增加ls可阅读性
        }
        closedir(pdir);

    }else{

        char* cwd = getcwd(NULL, 0); // 获取当前路径

        char StrcatName[1024] ={0};
        strcpy(StrcatName, cwd);
        strcat(StrcatName, "/");
        strcat(StrcatName, filename); // 把当前路径与传来的目录名拼接起来

        DIR* pdir = opendir(StrcatName); // 打开想要打开的目录

        while((pdirent = readdir(pdir)) != NULL){ // 循环读取目录内容
            strcat(buf, pdirent->d_name); // 把每一个文件名都拼接起来
            strcat(buf, "  "); // 再拼接两个空格，增加ls可阅读性
        }
        closedir(pdir);

    }

    char* dir = buf;
    return dir;

}

// pwd返回当前路径，不需要传递文件名
char* PwdDir(){
    char* cwd = getcwd(NULL, 0); // 获取当前路径
    return cwd; // 返回当前路径
}


//删除文件或目录
char * ReFile(char* Filename)   
{
    struct dirent* pdirent;     
    struct stat st;
    int ret = 0;
    char *cwd = getcwd(NULL,0); //获取当前路径
    DIR* pdir = opendir(cwd);       //打开当前目录
    if(NULL == pdir){             
        perror("no such file or directory");
        return "cannot find such file or directory";
    }
    while((pdirent = readdir(pdir)) != NULL){    //迭代读取目录内容
        stat(pdirent->d_name,&st);            
        if(S_ISDIR(st.st_mode) && strcmp(pdirent->d_name,Filename) == 0)
        {     //目标文件为文件夹
            ret = rmdir(pdirent->d_name);   //删除文件夹
            ERROR_CHECK(ret,-1,"rmdir");
            return "remove success";
        }
        else if(S_ISREG(st.st_mode) && strcmp(pdirent->d_name,Filename) == 0){ //目标文件为文件
            ret =  unlink(pdirent->d_name);  //删除文件
            ERROR_CHECK(ret,-1,"unlink");
            return "remove success";
        }
        else if(strcmp(pdirent->d_name,Filename)){   //文件不存在
            return "cannot find this file";
        }
    }
}
